<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="IUgQ0" id="IUgQ0"><span data-lake-id="udbdf2e35" id="udbdf2e35">典型回答</span></h1>
  <p data-lake-id="uba7ed7b1" id="uba7ed7b1"><span data-lake-id="u077faf0e" id="u077faf0e">​</span><br></p>
  <p data-lake-id="ud03c538d" id="ud03c538d"><strong><span data-lake-id="u89b20d16" id="u89b20d16">UUID(Universally Unique Identifier)全局唯一标识符，是指在一台机器上生成的数字，它的目标是保证对在同一时空中的所有机器都是唯一的。</span></strong></p>
  <p data-lake-id="u9c880eea" id="u9c880eea"><strong><span data-lake-id="u7c1075fc" id="u7c1075fc">​</span></strong><br></p>
  <p data-lake-id="ud3fab09b" id="ud3fab09b"><span data-lake-id="u3f5b0b3f" id="u3f5b0b3f">UUID 的生成是基于一定算法，通常使用的是随机数生成器或者基于时间戳的方式，生成的 UUID 由 32 位 16 进制数表示，共有 128 位（标准的UUID格式为：xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)，共32个字符）</span></p>
  <p data-lake-id="u4b596e14" id="u4b596e14"><span data-lake-id="ufb6f8ba0" id="ufb6f8ba0">​</span><br></p>
  <p data-lake-id="u4cab894c" id="u4cab894c"><strong><span data-lake-id="u225e0a5f" id="u225e0a5f">由于 UUID 是由 MAC 地址、时间戳、随机数等信息生成的，因此 UUID 具有极高的唯一性，可以说是几乎不可能重复，但是在实际实现过程中，UUID有多种实现版本，他们的唯一性指标也不尽相同。</span></strong></p>
  <p data-lake-id="u7ed8c39f" id="u7ed8c39f"><strong><span data-lake-id="u5ad5c214" id="u5ad5c214">​</span></strong><br></p>
  <p data-lake-id="ua6dfe72e" id="ua6dfe72e"><span data-lake-id="u0c3678c0" id="u0c3678c0">UUID在具体实现上，有多个版本，有基于时间的UUID V1，基于随机数的 UUID V4等。</span></p>
  <p data-lake-id="u6d59c730" id="u6d59c730"><span data-lake-id="u434fb788" id="u434fb788">​</span><br></p>
  <p data-lake-id="u18f0631f" id="u18f0631f"><span data-lake-id="ub144e664" id="ub144e664">Java中的java.util.UUID生成的UUID是V3和V4两种：</span></p>
  <p data-lake-id="u7e76aef9" id="u7e76aef9"><span data-lake-id="ua4cb287f" id="ua4cb287f">​</span><br></p>
  <p data-lake-id="u325eb7d8" id="u325eb7d8"><img src="https://cdn.nlark.com/yuque/0/2022/png/5378072/1669638424320-b15cfa40-ffc2-4ca0-9b61-78fccdf450cc.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_20%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u1372085e" id="u1372085e" style="text-align: left"><span data-lake-id="u84dd59e2" id="u84dd59e2" class="lake-fontsize-12" style="color: rgb(34, 34, 34)">​</span><br></p>
  <h4 data-lake-id="VkkiX" id="VkkiX"><span data-lake-id="u94563daf" id="u94563daf">优缺点</span></h4>
  <p data-lake-id="u723b2e3b" id="u723b2e3b"><br></p>
  <p data-lake-id="ued3875ae" id="ued3875ae"><strong><span data-lake-id="ud8e55898" id="ud8e55898">UUID的优点就是他的性能比较高，不依赖网络，本地就可以生成，使用起来也比较简单。</span></strong></p>
  <p data-lake-id="u7b1d49e4" id="u7b1d49e4"><strong><span data-lake-id="u29cfe6f5" id="u29cfe6f5">​</span></strong><br></p>
  <p data-lake-id="u71e561ff" id="u71e561ff"><strong><span data-lake-id="u60d4474b" id="u60d4474b">但是他也有两个比较明显的缺点，那就是长度过长和没有任何含义</span></strong><span data-lake-id="u3321f15c" id="u3321f15c">。长度自然不必说，他有32位16进制数字。对于"550e8400-e29b-41d4-a716-446655440000"这个字符串来说，我想任何一个程序员都看不出其表达的含义。一旦使用它作为全局唯一标识，就意味着在日后的问题排查和开发调试过程中会遇到很大的困难。</span></p>
  <p data-lake-id="uf60aee16" id="uf60aee16"><span data-lake-id="u0aeaf667" id="u0aeaf667">​</span><br></p>
  <h4 data-lake-id="AjR9N" id="AjR9N"><span data-lake-id="u8112c94a" id="u8112c94a">各个版本实现</span></h4>
  <p data-lake-id="uab39cdf1" id="uab39cdf1"><span data-lake-id="u7b82b842" id="u7b82b842">​</span><br></p>
  <p data-lake-id="ub6ba0c10" id="ub6ba0c10"><strong><span data-lake-id="u8497c942" id="u8497c942">V1. 基于时间戳的UUID</span></strong></p>
  <p data-lake-id="u8733580a" id="u8733580a"><span data-lake-id="u35ead048" id="u35ead048">​</span><br></p>
  <p data-lake-id="uad9dccce" id="uad9dccce"><span data-lake-id="u87066ef1" id="u87066ef1">基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。</span><strong><span data-lake-id="ua57b3117" id="ua57b3117">由于在算法中使用了MAC地址，这个版本的UUID可以保证在全球范围的唯一性。</span></strong></p>
  <p data-lake-id="uee4d1786" id="uee4d1786"><span data-lake-id="u02387dcd" id="u02387dcd">​</span><br></p>
  <p data-lake-id="u894a705d" id="u894a705d"><span data-lake-id="ucee25bbc" id="ucee25bbc">但与此同时，使用MAC地址会带来安全性问题，这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用，也可以使用退化的算法，以IP地址来代替MAC地址。</span></p>
  <p data-lake-id="u8610a36e" id="u8610a36e"><span data-lake-id="ue8bb88fc" id="ue8bb88fc">​</span><br></p>
  <p data-lake-id="u4bb0599c" id="u4bb0599c"><strong><span data-lake-id="uf6c86b8a" id="uf6c86b8a">V2. DCE(Distributed Computing Environment)安全的UUID</span></strong></p>
  <p data-lake-id="uf451b915" id="uf451b915"><span data-lake-id="u1b8153e4" id="u1b8153e4">​</span><br></p>
  <p data-lake-id="ufaab47bc" id="ufaab47bc"><span data-lake-id="u40980acc" id="u40980acc">和基于时间的UUID算法相同，但会把时间戳的前4位置换为POSIX的UID或GID，这个版本的UUID在实际中较少用到。</span></p>
  <p data-lake-id="u6184fe6c" id="u6184fe6c"><span data-lake-id="ud1f95eec" id="ud1f95eec">​</span><br></p>
  <p data-lake-id="ucc6f9c2f" id="ucc6f9c2f"><strong><span data-lake-id="u8c1db68b" id="u8c1db68b">V3. 基于名称空间的UUID(MD5)</span></strong></p>
  <p data-lake-id="ub6dabf94" id="ub6dabf94"><span data-lake-id="uefb89628" id="uefb89628">​</span><br></p>
  <p data-lake-id="u49a46f2f" id="u49a46f2f"><span data-lake-id="u46bfc25c" id="u46bfc25c">基于名称的UUID通过计算名称和名称空间的MD5散列值得到。</span></p>
  <p data-lake-id="u4ccf3491" id="u4ccf3491"><span data-lake-id="uebd49525" id="uebd49525">​</span><br></p>
  <p data-lake-id="u7152391e" id="u7152391e"><strong><span data-lake-id="u599321b8" id="u599321b8">这个版本的UUID保证了：相同名称空间中不同名称生成的UUID的唯一性；不同名称空间中的UUID的唯一性；相同名称空间中相同名称的UUID重复生成得到的结果是相同的。</span></strong></p>
  <p data-lake-id="uffb396b8" id="uffb396b8"><span data-lake-id="uc0b2af03" id="uc0b2af03">​</span><br></p>
  <p data-lake-id="u26d1125b" id="u26d1125b"><strong><span data-lake-id="u44912d1c" id="u44912d1c">V4. 基于随机数的UUID</span></strong></p>
  <p data-lake-id="uabd44eec" id="uabd44eec"><span data-lake-id="u67ea48ef" id="u67ea48ef">​</span><br></p>
  <p data-lake-id="u6095ec53" id="u6095ec53"><span data-lake-id="u2221c2b7" id="u2221c2b7">根据随机数，或者伪随机数生成UUID。该版本 UUID 采用随机数生成器生成，它可以保证生成的 UUID 具有极佳的唯一性。但是因为基于随机数的，所以，并不适合数据量特别大的场景。</span></p>
  <p data-lake-id="ud71a035e" id="ud71a035e"><span data-lake-id="u0dbf4254" id="u0dbf4254">​</span><br></p>
  <p data-lake-id="ua7a9ed29" id="ua7a9ed29"><strong><span data-lake-id="u4bb0ee4f" id="u4bb0ee4f">V5. 基于名称空间的UUID(SHA1)</span></strong></p>
  <p data-lake-id="u801772e8" id="u801772e8"><span data-lake-id="u2d1fed70" id="u2d1fed70">​</span><br></p>
  <p data-lake-id="u9e1aaddb" id="u9e1aaddb"><span data-lake-id="u383bdd27" id="u383bdd27">和版本3的UUID算法类似，只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。</span></p>
  <p data-lake-id="u773db525" id="u773db525"><span data-lake-id="uc0b0b055" id="uc0b0b055">​</span><br></p>
  <h4 data-lake-id="FWSxh" id="FWSxh"><span data-lake-id="u392147aa" id="u392147aa">各个版本总结</span></h4>
  <p data-lake-id="u085631ef" id="u085631ef"><br></p>
  <p data-lake-id="u6302e4a9" id="u6302e4a9"><span data-lake-id="ub6b20766" id="ub6b20766">可以简单总结一下，Version 1和Version 2 这两个版本的UUID，主要基于时间和MAC地址，所以比较适合应用于分布式计算环境下，具有高度唯一性。</span></p>
  <p data-lake-id="ua1ce48fc" id="ua1ce48fc"><span data-lake-id="u59e9ed08" id="u59e9ed08">​</span><br></p>
  <p data-lake-id="u9c12975b" id="u9c12975b"><span data-lake-id="u1436c3e8" id="u1436c3e8">Version 3和 Version 5 这两种UUID都是基于名称空间的，所以在一定范围内是唯一的，而且如果有需要生成重复UUID的场景的话，这两种是可以实现的。</span></p>
  <p data-lake-id="u0242c6b3" id="u0242c6b3"><span data-lake-id="ucd4810ef" id="ucd4810ef">​</span><br></p>
  <p data-lake-id="ue9c3d1de" id="ue9c3d1de"><span data-lake-id="u6391d588" id="u6391d588">Version 4 这种是最简单的，只是基于随机数生成的，但是也是最不靠谱的。适合数据量不是特别大的场景下</span></p>
  <p data-lake-id="ua4aa70c2" id="ua4aa70c2"><br></p>
 </body>
</html>